#pragma once

#include "zRaster.h"

namespace ck
{
	namespace data
	{
		class RasterMask;
		class RasterBand;
		class MatrixI;
	}

	namespace algorithm
	{
		namespace raster
		{
			class RasterGLCM;
			class ZRASTER_API RasterGLCMFactory
			{
			public:
				RasterGLCMFactory();
				virtual ~RasterGLCMFactory();

			public:
				static RasterGLCMFactory*	GetInstance();

			public:
				RasterGLCM*	CreateGLCM_00(z_uint32 greys, z_int32 stride, data::RasterBand* pBand);
				RasterGLCM*	CreateGLCM_45(z_uint32 greys, z_int32 stride, data::RasterBand* pBand);
				RasterGLCM*	CreateGLCM_90(z_uint32 greys, z_int32 stride, data::RasterBand* pBand);
				RasterGLCM*	CreateGLCM_135(z_uint32 greys, z_int32 stride, data::RasterBand* pBand);

				RasterGLCM*	CreateGLCM_00(z_uint32 greys, z_int32 stride, data::MatrixI* pMat, data::RasterMask* pMask = NULL);
				RasterGLCM*	CreateGLCM_45(z_uint32 greys, z_int32 stride, data::MatrixI* pMat, data::RasterMask* pMask = NULL);
				RasterGLCM*	CreateGLCM_90(z_uint32 greys, z_int32 stride, data::MatrixI* pMat, data::RasterMask* pMask = NULL);
				RasterGLCM*	CreateGLCM_135(z_uint32 greys, z_int32 stride, data::MatrixI* pMat, data::RasterMask* pMask = NULL);

				RasterGLCM*	CreateGLCM_00(z_uint32 greys, z_int32 stride, z_int32* data, z_uint32 w, z_uint32 h, data::RasterMask* pMask=NULL);
				RasterGLCM*	CreateGLCM_45(z_uint32 greys, z_int32 stride, z_int32* data, z_uint32 w, z_uint32 h, data::RasterMask* pMask = NULL);
				RasterGLCM*	CreateGLCM_90(z_uint32 greys, z_int32 stride, z_int32* data, z_uint32 w, z_uint32 h, data::RasterMask* pMask = NULL);
				RasterGLCM*	CreateGLCM_135(z_uint32 greys, z_int32 stride, z_int32* data, z_uint32 w, z_uint32 h, data::RasterMask* pMask = NULL);

			protected:
				//RasterGLCM*	CreateGLCM(z_uint32 greys, z_int32 xstride, z_int32 ystride, data::RasterBand* pBand);
				RasterGLCM* CreateGLCM(z_uint32 greys, z_int32 xstride, z_int32 ystride, z_int32* data, z_uint32 w, z_uint32 h,data::RasterMask* pMask);


				//RasterGLCM*	CreateGLCM_45();
				//RasterGLCM*	CreateGLCM_90();
				//RasterGLCM*	CreateGLCM_135();
			};

		}
	}
}